package com.sc.javaee.util;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.UUID;

//文件上传和下载的工具类
//只适合springboot(底层内置是tomcat)
public class UpDowns {
    public static String getPath(){
        //获取内置tomcat虚拟地址
        String path= null;
        try {
            path = ResourceUtils
                    .getFile("classpath:")
                    .getPath();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //这样前端就可以通过http://ip:端口/upload/xx.png就可以访问
        //如果前端跨域成功了  /api/upload/xx.png
        path=path+"/static/upload/";
        return path;
    }
    //上传
    public static String upload(MultipartFile myHead){
        //获取内置tomcat虚拟地址
        String path=getPath();
        File f=new File(path);
        if(!f.exists()) f.mkdirs();
        //2.保存的文件名 一定不是上传的文件名 (可能会有重名)
        //文件名需要随机处理  后缀名需要保留
        String filename=myHead.getOriginalFilename();
        //如果前端不传递文件
        if(filename.equals("")) return null;
        String suffix=filename.substring(filename.lastIndexOf("."));
        //随机文件名 通过UUID 它可以生产32位永不重复的字符串
        String name= UUID.randomUUID().toString();

        File newFile=new File(path+name+suffix);
        //开始上传文件
        try {
            myHead.transferTo(newFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return name+suffix;
    }
    //下载
    public static ResponseEntity<byte[]> download(String filename){
        //1.创建头部信息
        HttpHeaders headers=new HttpHeaders();
        //2.通过头信息 设置文档类型  设置流的格式
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        byte[] bs= new byte[0];
        try {
            //3.可选的 设置文件名编码方式  如果文件名是中文也可以识别
            filename=URLEncoder.encode(filename,"utf-8");
            //4.指定附件形式下载  同时还可以提供下载后的文件名
            headers.setContentDispositionFormData("attachment",filename);
            //5.读取文件 生成字节数组
            //String path=req.getServletContext().getRealPath("/upload/");
            String path=getPath();
            File f=new File(path+filename);
            //bs = FileUtils.readFileToByteArray(f);
            FileInputStream fis=new FileInputStream(f);
            bs=new byte[fis.available()];
            fis.read(bs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ResponseEntity<byte[]> re=
                new ResponseEntity(bs,headers, HttpStatus.CREATED);
        return re;
    }
}
